﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SoftwareConsulting.BI11.Controls.Properties;

namespace SoftwareConsulting.BI11.Controls
{
    /// <summary>
    /// Класс бокса подсказки
    /// </summary>
    public partial class TipBox : UserControl
    {        
        private int _fullHeight; //полня высота бокса
        private bool _closed; //флаг закрытой подсказки
        private bool _canBeClosed = true; //флаг закрываемой подсказки
        private bool _moreVisible = true; //видимость гиперлинки на справку
        public event RolledUp OnRolledUp;
        public event RolledDown OnRolledDown;

        /// <summary>
        /// Возвращает/устанавливает полную высоту бокса
        /// </summary>
        public int FullHeight
        {
            get
            {
                return _fullHeight;
            }
            set
            {                
                _fullHeight = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает текст подсказки
        /// </summary>
        public string TipText
        {
            get
            {
                return TipLabel.Text;
            }
            set
            {
                TipLabel.Text = value;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает флаг закрытой подсказки
        /// </summary>
        public bool Closed
        {
            get
            {
                return _closed;
            }
            set
            {
                bool oldValue = _closed;                
                _closed = _canBeClosed ? value : false;
                Height = _closed ? 24 : _fullHeight;
                if (_closed)
                {
                    if (OnRolledUp != null)
                        OnRolledUp();
                }
                else
                {
                    if (OnRolledDown != null)
                        OnRolledDown();
                }
                NoTipLabel.Text = _closed ? Resources.BI_TIPBOX_SHOW : Resources.BI_TIPBOX_HIDE;
                NoTipLabel.Left = _closed ? Width - 60 : Width - 51;
                MoreLabel.Visible = !_closed && MoreVisible;                
            }
        }

        /// <summary>
        /// Возвращает/устанавливает видимость гиперлинки на справку
        /// </summary>
        [DefaultValue(true)]
        public bool MoreVisible
        {
            get
            {
                return _moreVisible;
            }
            set
            {
                _moreVisible = value;
                MoreLabel.Visible = _moreVisible;
            }
        }

        /// <summary>
        /// Возвращает/устанавливает флаг закрываемой подсказки
        /// </summary>
        [DefaultValue(true)]
        public bool CanBeClosed
        {
            get
            {
                return _canBeClosed;
            }
            set
            {
                _canBeClosed = value;                
                NoTipLabel.Visible = false;
            }
        }

        /// <summary>
        /// Автоматически устанавливает FullHeight в дизайнере
        /// </summary>
        private void FitFullHeight()
        {
            if ((Site != null) && Site.DesignMode)
                FullHeight = Height;
        }

        /// <summary>
        /// Конструктор класса
        /// </summary>
        public TipBox()
        {           
            InitializeComponent();            
        }

        private void NoTipLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            Closed = !Closed;
        }

        private void TipArea_MouseMove(object sender, MouseEventArgs e)
        {
            NoTipLabel.Visible = (e.Y < 24) && _canBeClosed;
            if (NoTipLabel.Visible)
            {
                if (TipArea.Cursor != Cursors.Hand)
                    TipArea.Cursor = Cursors.Hand;
            }
            else
            {
                if (TipArea.Cursor != Cursors.Default)
                    TipArea.Cursor = Cursors.Default;
            }            
        }

        private void TipArea_MouseLeave(object sender, EventArgs e)
        {
            NoTipLabel.Visible = false;
            TipArea.Cursor = Cursors.Default;            
        }

        private void TipArea_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Y < 24)
                Closed = !Closed;
        }

        private void NoTipLabel_MouseMove(object sender, MouseEventArgs e)
        {
            NoTipLabel.Visible = _canBeClosed;
        }

        private void TipBox_Resize(object sender, EventArgs e)
        {
            FitFullHeight();
        }

        private void TipBox_SizeChanged(object sender, EventArgs e)
        {
            FitFullHeight();
        }        
    }

    public delegate void RolledUp();
    public delegate void RolledDown();
}
